package controller;

import java.util.ArrayList;
import java.util.List;

import model.*;
import beans.*;
import dao.*;
import dto.*;


public class AdministradorSucursal {
	private static AdministradorSucursal instancia;

	private AdministradorSucursal() {

	}

	public static AdministradorSucursal getInstancia() {
		if (instancia == null)
			instancia = new AdministradorSucursal();
		return instancia;
	}

	public SucursalBean fromModelTOBean(Sucursal sucursal) {
		SucursalBean sucursalBean = null;
		if (sucursal != null) {
			sucursalBean = new SucursalBean();
			sucursalBean.setIdSucursal(sucursal.getId());
			sucursalBean.setAreas(AdministradorArea.getInstancia()
					.fromModelTOBean(sucursal.getAreas()));
			sucursalBean.setCaja(AdministradorCaja.getInstancia()
					.fromModelTOBean(sucursal.getCaja()));
			sucursalBean.setComisiones(AdministradorComision.getInstancia()
					.fromModelTOBean(sucursal.getComisiones()));

			if (sucursal.getDeposito() != null
					&& sucursal.getDeposito().getClass().toString()
							.contains("Central"))
				sucursalBean.setDeposito(AdministradorDeposito.getInstancia()
						.fromModelTOBeanCentral(
								(DepositoCentral) sucursal.getDeposito()));
			else
				sucursalBean.setDeposito(AdministradorDeposito.getInstancia()
						.fromModelTOBean(sucursal.getDeposito()));

			sucursalBean.setNombre(sucursal.getNombre());
			sucursalBean.setSalon(AdministradorSalon.getInstancia()
					.fromModelTOBean(sucursal.getSalon()));
			sucursalBean.setVentas(AdministradorVenta.getInstancia()
					.fromModelTOBean(sucursal.getVentas()));
			sucursalBean.setCartas(AdministradorCarta.getInstancia()
					.fromModelTOBean(sucursal.getCartas()));
			for (CartaBean carta : sucursalBean.getCartas()) {
				for (RubroBean rubro : carta.getRubroBean()) {
					for (PlatoBean plato : rubro.getPlatos()) {
						PlatoBean platobean=buscarPlatoBean(sucursalBean,plato);
						plato.setArea(platobean.getArea());
					}
				}
			}
			for (VentaBean venta : sucursalBean.getVentas()) {
				for (ComandaBean comanda : venta.getComandas()) {
					for (itemComandaBean items : comanda.getItems()) {
						PlatoBean platobean=buscarPlatoBean(sucursalBean,items.getPlato());
						items.getPlato().setArea(platobean.getArea());
					}
				}
			}
			for (VentaBean venta : sucursalBean.getVentas()) {
				for (ItemVentaBean items : venta.getItems()) {
						PlatoBean platobean=buscarPlatoBean(sucursalBean,items.getItem());
						items.getItem().setArea(platobean.getArea());
				}
			}
			if(sucursalBean.getSalon()!=null){
				for (ComandaBean comanda : sucursalBean.getSalon().getComandas()) {
					for (itemComandaBean items : comanda.getItems()) {
						PlatoBean platobean=buscarPlatoBean(sucursalBean,items.getPlato());
						items.getPlato().setArea(platobean.getArea());
					}
				}	
			}
			if(sucursalBean.getCaja()!=null){
			for (CajaDiariaBean caja : sucursalBean.getCaja().getCajas()) {
				for (FacturaBean factura : caja.getFacturas()) {
					for (ItemFacturaBean item : factura.getItems()) {
						PlatoBean platobean=buscarPlatoBean(sucursalBean,item.getPlato());
						item.getPlato().setArea(platobean.getArea());
					}
					for (ComandaBean comanda : factura.getVenta().getComandas()) {
						for (itemComandaBean itemsc : comanda.getItems()) {
							PlatoBean platobean=buscarPlatoBean(sucursalBean,itemsc.getPlato());
							itemsc.getPlato().setArea(platobean.getArea());
						}
					}
					for (ItemVentaBean itemv : factura.getVenta().getItems()) {
						PlatoBean platobean=buscarPlatoBean(sucursalBean,itemv.getItem());
						itemv.getItem().setArea(platobean.getArea());
					}
					
				}
				for (PagoBean pago : caja.getPagos()) {
						for (ItemFacturaBean item : pago.getFactura().getItems()) {
							PlatoBean platobean=buscarPlatoBean(sucursalBean,item.getPlato());
							item.getPlato().setArea(platobean.getArea());
						}
						for (ComandaBean comanda : pago.getFactura().getVenta().getComandas()) {
							for (itemComandaBean itemsc : comanda.getItems()) {
								PlatoBean platobean=buscarPlatoBean(sucursalBean,itemsc.getPlato());
								itemsc.getPlato().setArea(platobean.getArea());
							}
						}
						for (ItemVentaBean itemv : pago.getFactura().getVenta().getItems()) {
							PlatoBean platobean=buscarPlatoBean(sucursalBean,itemv.getItem());
							itemv.getItem().setArea(platobean.getArea());
						}
				}
			}
			}
			
		}
		return sucursalBean;

	}

	private PlatoBean buscarPlatoBean(SucursalBean sucursalBean, PlatoBean plato) {
		for (AreaBean area : sucursalBean.getAreas()) {
			for (PlatoBean platob : area.getPlatos()) {
				if(platob.getIdPlato()==plato.getIdPlato())
					return platob;
			}
		}
		return null;
	}

	public void merge(Sucursal sucursal) {
		SucursalBean sucursalBean = fromModelTOBean(sucursal);
		HibernateSucursalDAO.getInstancia().merge(sucursalBean);

	}

	public List<Sucursal> listSucursales() {
		List<SucursalBean> sucursalesBean = HibernateSucursalDAO.getInstancia()
				.list();
		return fromBeanTOModel(sucursalesBean);
	}

	public List<Sucursal> fromBeanTOModel(List<SucursalBean> sucursalesBean) {
		List<Sucursal> sucursales = new ArrayList<Sucursal>();
		for (SucursalBean sucursalBean : sucursalesBean) {
			Sucursal sucursal = fromBeanTOModel(sucursalBean);
			sucursales.add(sucursal);
		}
		return sucursales;
	}

	public Sucursal fromBeanTOModel(SucursalBean sucursalBean) {
		Sucursal sucursal = null;
		if (sucursalBean != null) {
			sucursal = new Sucursal();
			sucursal.setId(sucursalBean.getIdSucursal());
			sucursal.setAreas(AdministradorArea.getInstancia().fromBeanTOModel(
					sucursalBean.getAreas()));
			sucursal.setCaja(AdministradorCaja.getInstancia().fromBeanTOModel(
					sucursalBean.getCaja()));
			sucursal.setComisiones(AdministradorComision.getInstancia()
					.fromBeanTOModel(sucursalBean.getComisiones()));

			if (sucursalBean.getDeposito() != null
					&& sucursalBean.getDeposito().getClass().toString()
							.contains("Central"))
				sucursal.setDeposito(AdministradorDeposito.getInstancia()
						.fromBeanTOModelCentral(sucursalBean.getDeposito()));
			else
				sucursal.setDeposito(AdministradorDeposito.getInstancia()
						.fromBeanTOModel(sucursalBean.getDeposito()));
			sucursal.setNombre(sucursalBean.getNombre());
			sucursal.setSalon(AdministradorSalon.getInstancia()
					.fromBeanTOModel(sucursalBean.getSalon()));
			sucursal.setCartas(AdministradorCarta.getInstancia()
					.fromBeanTOModel(sucursalBean.getCartas()));
			sucursal.setVentas(AdministradorVenta.getInstancia()
					.fromBeanTOModelV(sucursalBean.getVentas()));
			for (Carta carta : sucursal.getCartas()) {
				for (Rubro rubro : carta.getRubros()) {
					for (Plato plato : rubro.getPlatos()) {
						Plato plato1=buscarPlato(sucursal,plato);
						plato.setArea(plato1.getArea());
					}
				}
			}
			for (Venta venta : sucursal.getVentas()) {
				for (Comanda comanda : venta.getComandas()) {
					for (ItemComanda items : comanda.getItems()) {
						Plato plato=buscarPlato(sucursal,items.getPlato());
						items.getPlato().setArea(plato.getArea());
					}
				}
			}
			for (Venta venta : sucursal.getVentas()) {
				for (ItemVenta items : venta.getItems()) {
						Plato plato=buscarPlato(sucursal,items.getItem());
						items.getItem().setArea(plato.getArea());
				}
			}
			if(sucursal.getSalon()!=null){
				for (Comanda comanda : sucursal.getSalon().getComandas()) {
					for (ItemComanda items : comanda.getItems()) {
						Plato plato=buscarPlato(sucursal,items.getPlato());
						items.getPlato().setArea(plato.getArea());
					}
				}
			}
			
			
			if(sucursal.getCaja()!=null){
			for (CajaDiaria caja : sucursal.getCaja().getCajas()) {
				for (Factura factura : caja.getFacturas()) {
					for (ItemFactura item : factura.getItems()) {
						Plato platobean=buscarPlato(sucursal,item.getPlato());
						item.getPlato().setArea(platobean.getArea());
					}
					for (Comanda comanda : factura.getVenta().getComandas()) {
						for (ItemComanda itemsc : comanda.getItems()) {
							Plato platobean=buscarPlato(sucursal,itemsc.getPlato());
							itemsc.getPlato().setArea(platobean.getArea());
						}
					}
					for (ItemVenta itemv : factura.getVenta().getItems()) {
						Plato platobean=buscarPlato(sucursal,itemv.getItem());
						itemv.getItem().setArea(platobean.getArea());
					}
					
				}
				for (Pago pago : caja.getPagos()) {
						for (ItemFactura item : pago.getFactura().getItems()) {
							Plato platobean=buscarPlato(sucursal,item.getPlato());
							item.getPlato().setArea(platobean.getArea());
						}
						for (Comanda comanda : pago.getFactura().getVenta().getComandas()) {
							for (ItemComanda itemsc : comanda.getItems()) {
								Plato platobean=buscarPlato(sucursal,itemsc.getPlato());
								itemsc.getPlato().setArea(platobean.getArea());
							}
						}
						for (ItemVenta itemv : pago.getFactura().getVenta().getItems()) {
							Plato platobean=buscarPlato(sucursal,itemv.getItem());
							itemv.getItem().setArea(platobean.getArea());
						}
				}
			}
			}
		}
		return sucursal;
	}

	private Plato buscarPlato(Sucursal sucursal, Plato plato) {
		for (Area area : sucursal.getAreas()) {
			for (Plato platob : area.getPlatos()) {
				if(platob.getId()==plato.getId())
					return platob;
			}
		}
		return null;
	}

	public Sucursal fromDTOTOModel(SucursalDTO sucursalDTO) {
		Sucursal sucursal = null;
		if (sucursalDTO != null) {
			sucursal = new Sucursal();
			sucursal.setId(sucursalDTO.getId());
			sucursal.setAreas(AdministradorArea.getInstancia().fromDTOTOModel(
					sucursalDTO.getAreas()));
			sucursal.setCaja(AdministradorCaja.getInstancia().fromDTOTOModel(
					sucursalDTO.getCaja()));
			sucursal.setComisiones(AdministradorComision.getInstancia()
					.fromDTOTOModel(sucursalDTO.getComisiones()));

			if (sucursalDTO.getDeposito() != null
					&& sucursalDTO.getDeposito().getClass().toString()
							.equals("Central"))
				sucursal.setDeposito(AdministradorDeposito.getInstancia()
						.fromDTOTOModelCentral(sucursalDTO.getDeposito()));
			else
				sucursal.setDeposito(AdministradorDeposito.getInstancia()
						.fromDTOTOModel(sucursalDTO.getDeposito()));

			sucursal.setNombre(sucursalDTO.getNombre());
			sucursal.setSalon(AdministradorSalon.getInstancia().fromDTOTOModel(
					sucursalDTO.getSalon()));
			sucursal.setCartas(AdministradorCarta.getInstancia()
					.fromDTOTOModel(sucursalDTO.getCartas()));
			sucursal.setVentas(AdministradorVenta.getInstancia()
					.fromDTOTOModel(sucursalDTO.getVentas()));
			for (Carta carta : sucursal.getCartas()) {
				for (Rubro rubro : carta.getRubros()) {
					for (Plato plato : rubro.getPlatos()) {
						Plato plato1=buscarPlato(sucursal,plato);
						plato.setArea(plato1.getArea());
					}
				}
			}
			for (Venta venta : sucursal.getVentas()) {
				for (Comanda comanda : venta.getComandas()) {
					for (ItemComanda items : comanda.getItems()) {
						Plato plato=buscarPlato(sucursal,items.getPlato());
						items.getPlato().setArea(plato.getArea());
					}
				}
			}
			for (Venta venta : sucursal.getVentas()) {
				for (ItemVenta items : venta.getItems()) {
						Plato plato=buscarPlato(sucursal,items.getItem());
						items.getItem().setArea(plato.getArea());
				}
			}
			if(sucursal.getSalon()!=null){
				for (Comanda comanda : sucursal.getSalon().getComandas()) {
					for (ItemComanda items : comanda.getItems()) {
						Plato plato=buscarPlato(sucursal,items.getPlato());
						items.getPlato().setArea(plato.getArea());
					}
				}
			}
			if(sucursal.getCaja()!=null){
			for (CajaDiaria caja : sucursal.getCaja().getCajas()) {
				for (Factura factura : caja.getFacturas()) {
					for (ItemFactura item : factura.getItems()) {
						Plato platobean=buscarPlato(sucursal,item.getPlato());
						item.getPlato().setArea(platobean.getArea());
					}
					for (Comanda comanda : factura.getVenta().getComandas()) {
						for (ItemComanda itemsc : comanda.getItems()) {
							Plato platobean=buscarPlato(sucursal,itemsc.getPlato());
							itemsc.getPlato().setArea(platobean.getArea());
						}
					}
					for (ItemVenta itemv : factura.getVenta().getItems()) {
						Plato platobean=buscarPlato(sucursal,itemv.getItem());
						itemv.getItem().setArea(platobean.getArea());
					}
					
				}
				for (Pago pago : caja.getPagos()) {
						for (ItemFactura item : pago.getFactura().getItems()) {
							Plato platobean=buscarPlato(sucursal,item.getPlato());
							item.getPlato().setArea(platobean.getArea());
						}
						for (Comanda comanda : pago.getFactura().getVenta().getComandas()) {
							for (ItemComanda itemsc : comanda.getItems()) {
								Plato platobean=buscarPlato(sucursal,itemsc.getPlato());
								itemsc.getPlato().setArea(platobean.getArea());
							}
						}
						for (ItemVenta itemv : pago.getFactura().getVenta().getItems()) {
							Plato platobean=buscarPlato(sucursal,itemv.getItem());
							itemv.getItem().setArea(platobean.getArea());
						}
				}
			}
			}
		}
		return sucursal;
	}

	public SucursalDTO fromModelTODTO(Sucursal sucursal) {
		SucursalDTO sucursalDTO = null;
		if (sucursal != null) {
			sucursalDTO = new SucursalDTO();
			sucursalDTO.setId(sucursal.getId());
			sucursalDTO.setAreas(AdministradorArea.getInstancia()
					.fromModelTODTO(sucursal.getAreas()));
			sucursalDTO.setCaja(AdministradorCaja.getInstancia()
					.fromModelTODTO(sucursal.getCaja()));
			sucursalDTO.setComisiones(AdministradorComision.getInstancia()
					.fromModelTODTO(sucursal.getComisiones()));
			if (sucursal.getDeposito() != null
					&& sucursal.getDeposito().getClass().toString()
							.equals("Central"))
				sucursalDTO.setDeposito(AdministradorDeposito.getInstancia()
						.fromModelTODTO(sucursal.getDeposito()));
			else
				sucursalDTO.setDeposito(AdministradorDeposito.getInstancia()
						.fromModelTODTO(sucursal.getDeposito()));
			sucursalDTO.setNombre(sucursal.getNombre());
			sucursalDTO.setSalon(AdministradorSalon.getInstancia()
					.fromModelTODTO(sucursal.getSalon()));
			sucursalDTO.setCartas(AdministradorCarta.getInstancia()
					.fromModelTODTO(sucursal.getCartas()));
			sucursalDTO.setVentas(AdministradorVenta.getInstancia()
					.fromModelTODTO(sucursal.getVentas()));
			for (CartaDTO cDTO : sucursalDTO.getCartas()) {
				for (RubroDTO rubro : cDTO.getRubros()) {
					for (PlatoDTO plato : rubro.getPlatos()) {
						PlatoDTO plato1=buscarPlatoDTO(sucursalDTO,plato);
						plato.setArea(plato1.getArea());
					}
				}
			}
			for (VentaDTO venta : sucursalDTO.getVentas()) {
				for (ComandaDTO comanda : venta.getComandas()) {
					for (itemComandaDTO items : comanda.getItems()) {
						PlatoDTO plato=buscarPlatoDTO(sucursalDTO,items.getPlato());
						items.getPlato().setArea(plato.getArea());
					}
				}
			}
			for (VentaDTO venta : sucursalDTO.getVentas()) {
				for (ItemVentaDTO items : venta.getItems()) {
						PlatoDTO plato=buscarPlatoDTO(sucursalDTO,items.getItem());
						items.getItem().setArea(plato.getArea());
				}
			}
			if(sucursalDTO.getSalon()!=null){
				for (ComandaDTO comanda : sucursalDTO.getSalon().getComandas()) {
					for (itemComandaDTO items : comanda.getItems()) {
						PlatoDTO plato=buscarPlatoDTO(sucursalDTO,items.getPlato());
						items.getPlato().setArea(plato.getArea());
					}
				}
			}
			if(sucursalDTO.getCaja()!=null){
			for (CajaDiariaDTO caja : sucursalDTO.getCaja().getCajas()) {
				for (FacturaDTO factura : caja.getFacturas()) {
					for (ItemFacturaDTO item : factura.getItems()) {
						PlatoDTO platobean=buscarPlatoDTO(sucursalDTO,item.getPlato());
						item.getPlato().setArea(platobean.getArea());
					}
					for (ComandaDTO comanda : factura.getVenta().getComandas()) {
						for (itemComandaDTO itemsc : comanda.getItems()) {
							PlatoDTO platobean=buscarPlatoDTO(sucursalDTO,itemsc.getPlato());
							itemsc.getPlato().setArea(platobean.getArea());
						}
					}
					for (ItemVentaDTO itemv : factura.getVenta().getItems()) {
						PlatoDTO platobean=buscarPlatoDTO(sucursalDTO,itemv.getItem());
						itemv.getItem().setArea(platobean.getArea());
					}
					
				}
				for (PagoDTO pago : caja.getPagos()) {
						for (ItemFacturaDTO item : pago.getFactura().getItems()) {
							PlatoDTO platobean=buscarPlatoDTO(sucursalDTO,item.getPlato());
							item.getPlato().setArea(platobean.getArea());
						}
						for (ComandaDTO comanda : pago.getFactura().getVenta().getComandas()) {
							for (itemComandaDTO itemsc : comanda.getItems()) {
								PlatoDTO platobean=buscarPlatoDTO(sucursalDTO,itemsc.getPlato());
								itemsc.getPlato().setArea(platobean.getArea());
							}
						}
						for (ItemVentaDTO itemv : pago.getFactura().getVenta().getItems()) {
							PlatoDTO platobean=buscarPlatoDTO(sucursalDTO,itemv.getItem());
							itemv.getItem().setArea(platobean.getArea());
						}
				}
			}
			}
		}
		return sucursalDTO;
	}

	private PlatoDTO buscarPlatoDTO(SucursalDTO sucursalDTO, PlatoDTO plato) {
		for (AreaDTO area : sucursalDTO.getAreas()) {
			for (PlatoDTO platob : area.getPlatos()) {
				if(platob.getId()==plato.getId())
					return platob;
			}
		}
		return null;
	}

	public void grabarSucursal(Sucursal sucursal) {
		SucursalBean sucursalBean = fromModelTOBean(sucursal);
		HibernateSucursalDAO.getInstancia().grabarSurcursal(sucursalBean);

	}

	public void grabarSucursal(SucursalDTO sucursal) {
		Sucursal suc = fromDTOTOModel(sucursal);
		SucursalBean sucursalBean = fromModelTOBean(suc);
		HibernateSucursalDAO.getInstancia().grabarSurcursal(sucursalBean);

	}

	public Sucursal buscarSucursal(Sucursal s) {
		SucursalBean sb = fromModelTOBean(s);
		sb = HibernateSucursalDAO.getInstancia().buscarSucursal(sb);
		Sucursal s1 = fromBeanTOModel(sb);
		if (s1.getDeposito() != null) {
			DepositoCentralBean depositoCentralB = new DepositoCentralBean();
			depositoCentralB.setIdDeposito(sb.getDeposito().getIdDeposito());
			depositoCentralB = HibernateDepositoDAO.getInstancia()
					.buscarDepositoCentral(depositoCentralB);
			if (depositoCentralB != null) {
				s1.setDeposito(AdministradorDeposito.getInstancia()
						.fromBeanTOModelCentral(depositoCentralB));
			}
		}

		return s1;
	}

	public void updateSucursal(Sucursal s) {
		SucursalBean sb = fromModelTOBean(s);
		HibernateSucursalDAO.getInstancia().update(sb);

	}

	public Sucursal buscarSucursalxNombre(String sucursalDestino) {

		SucursalBean sb = HibernateSucursalDAO.getInstancia()
				.buscarSucursalxNombre(sucursalDestino);

		Sucursal s1 = fromBeanTOModel(sb);
		if (s1.getDeposito() != null) {
			DepositoCentralBean depositoCentralB = new DepositoCentralBean();
			depositoCentralB.setIdDeposito(sb.getDeposito().getIdDeposito());
			depositoCentralB = HibernateDepositoDAO.getInstancia()
					.buscarDepositoCentral(depositoCentralB);
			if (depositoCentralB != null) {
				s1.setDeposito(AdministradorDeposito.getInstancia()
						.fromBeanTOModelCentral(depositoCentralB));
			}
		}
		return s1;
	}

	public List<SucursalDTO> fromModelTODTO(List<Sucursal> sucursales) {
		List<SucursalDTO> sucursalesDTO=new ArrayList<SucursalDTO>();
		for (Sucursal sucursal : sucursales) {
			SucursalDTO sucursalDTO=fromModelTODTO(sucursal);
			sucursalesDTO.add(sucursalDTO);
		}
		return sucursalesDTO;
	}

	public void log(String user, String accion) {
		HibernateSucursalDAO.getInstancia().crearLog(user,accion);
		
	}
}

